#include <LiquidCrystal.h> //申明 1602 液晶的函数库
#include <SoftwareSerial.h>          //库文件
SoftwareSerial BT(A4,A5);           //设置蓝牙与板子的连接端口。  pin 8  接蓝牙的 TXD    pin 9 接蓝牙的 RXD
char X;                              //定义一个变量存数据。
int sta=0;
int buzzer=13;//设置控制蜂鸣器的数字IO脚
LiquidCrystal lcd(12,11,2,3,4,5,6,7,8,9,10);
int cmi;
#define Trig A2 //引脚Tring 连接 IO D2
#define Echo A3 //引脚Echo 连接 IO D3 
float cm; //距离变量
float temp; // 

void setup() 
{
  pinMode(buzzer,OUTPUT);
  Serial.begin(9600);              //串口监视器通信速率，38400
  Serial.println("蓝牙连接成功");     //串口监视器显示蓝牙正常状态
  BT.begin(9600);                  //蓝牙通信速率，默认一般为 38400
  lcd.begin(16,2); //初始化 1602 液晶工作模式
//定义 1602 液晶显示范围为 2 行 16 列字符
lcd.setCursor(0,0); //把光标定位在第 0 行，第 0 列
lcd.print("123456"); //显示
lcd.setCursor(0,2); //把光标定位在第 0 行，第 15 列
lcd.print("Arduino is fun"); //显示

 pinMode(Trig, OUTPUT);
  pinMode(Echo, INPUT);
  
}

void loop()                         //大循环，执行。
{
  if (Serial.available())           //检测：【串口】如果数据写入，则执行。
  {
    X = Serial.read();              //把写入的数据给到自定义变量  X
    BT.print(X);                    //把数据给蓝牙
    Serial.print(X);
  }

  if (BT.available())               //检测：【蓝牙】如果数据写入，则执行。
  {
  //  X = BT.read();                  //把检测到的数据给到自定义变量 X
  //  Serial.print(X);                //把从蓝牙得到的数据显示到串口监视器
   lcd.clear();
    // 读取串口缓冲区所以数据
      // 显示每一个字符到LCD显示屏
      X=BT.read();
      Serial.print(X);
      if(X=='O')
      {sta=1;}
      if(X=='F')
      {sta=0;}
      lcd.write(X);
  }
while(sta){
 //给Trig发送一个低高低的短时间脉冲,触发测距
  digitalWrite(Trig, LOW); //给Trig发送一个低电平
  delayMicroseconds(2);    //等待 2微妙
  digitalWrite(Trig,HIGH); //给Trig发送一个高电平
  delayMicroseconds(10);    //等待 10微妙
  digitalWrite(Trig, LOW); //给Trig发送一个低电平
  temp = float(pulseIn(Echo, HIGH)); //存储回波等待时间,
  //pulseIn函数会等待引脚变为HIGH,开始计算时间,再等待变为LOW并停止计时
  //返回脉冲的长度
  //声速是:340m/1s 换算成 34000cm / 1000000μs => 34 / 1000
  //因为发送到接收,实际是相同距离走了2回,所以要除以2
  //距离(厘米)  =  (回波时间 * (34 / 1000)) / 2
  //简化后的计算公式为 (回波时间 * 17)/ 1000
  cm = (temp * 17 )/1000; //把回波时间换算成cm
  cmi=cm;
  if(cm<20)
  {
digitalWrite(buzzer,HIGH);//发声音
delay(30+cmi*14);//延时1ms
//delay(300);
digitalWrite(buzzer,LOW);//不发声音
delay(30+cmi*14);//延时ms
//delay(300);
    }
     lcd.clear();
    lcd.print(cm);
    lcd.print("cm");
 
    Serial.println(cm);
      
  delay(500);
 if (BT.available())               //检测：【蓝牙】如果数据写入，则执行。
  {
   lcd.clear();
    // 读取串口缓冲区所以数据
      // 显示每一个字符到LCD显示屏
      X=BT.read();
      if(X=='O')
      {sta=1;}
      if(X=='F')
      {sta=0;}
      lcd.write(X);
    }
  }
}
